##### git 常用命令 ######

# https://git-scm.com/downloads

# 初始化仓库
git init

# 配置用户名与邮箱
git config --global user.name "chengqiushi"
git config --global user.email "chengqs@bonree.com"

# 生成 ssh 密钥
ssh-keygen -t rsa -C <your_email@example.com>

# 查看 git 仓库当前状态
git status

# 将修改内容添加至暂存区
git add <file_name>
git add .
# 提交暂存区修改至本地仓库. -am 参数可省略 add 过程
git commit -m "<commit_msg>"
git commit -am "<commit_msg>"
# 补充提交 (push后慎用)
git commit --amend

# 查看提交纪录
git log
# 更强大的版本信息，可以查看版本回退的操作
git reflog

# 查看工作区与暂存区差异
git diff
# 查看已暂存将要提交的内容
git diff --staged

# 放弃当前工作区改动 不可恢复!
git checkout <file_name>
git checkout .

# 放弃添加至暂存区的改动,移回工作区
git reset <file_name>
git reset .

# 移动当前分支至指定commit HEAD^ 指上一次commit
git reset --hard <commit_id>
git reset --hard HEAD^

# 查看当前本地分支
git branch
# 查看当前所有分支(包括远端分支)
git branch -a

# 创建分支
git branch <branch_name>
git checkout -b <branch_name>
# 切换分支
git checkout <branch_name>

# 删除分支 如果分支没有被合并,-d 会不允许删除分支,此时用-D可强行删除分支
git branch -d <branch_name>
git branch -D <branch_name>

# 将指定分支合并至当前分支
git merge <branch_name>
# 禁用 fast-forward 合并方式
git merge <branch_name> --no-ff

# 变基 将当前分支的基 变为指定分支
git rebase <branch_name>

# 冲突解决
# 当冲突发生时,首先解决代码中的冲突
# 然后执行 git add ./<所有冲突文件>
git merge/rebase --continue
# 冲突发生时,放弃本次合并/变基操作
git merge/rebase --abort

# 命令行起别名
git config alias.st "status"

# 删除文件
git rm person.m

# 远端操作

# 克隆远端git仓库至本地
git clone <远端仓库地址>

# 106.28 Gitlab服务器 ssh 端口改为了2226
# 仓库地址需要修改 如 git clone ssh://git@192.168.106.38:2226/chengqiushi/git_learn.git

# 推送本地仓库的提交至远端仓库 建议使用指定远端仓库与分支的命令
git push
git push origin <branch_name>

# 拉取远端仓库对应分支并与本地仓库合并 默认merge 可添加参数执行变基
git pull
git pull --rebase

# 保证将冲突控制在本地,防止远端出现冲突,push 前 一定要先 pull !!!!!
# 为保证单一分支的多人线性提交,避免出现大量merge commit造成log tree混乱,建议使用 --rebase

# 执行 pull 之前 必须保证当前分支与要拉取分支关联 (up to date)
# 可通过 git status 查看当前分支的关联情况

# push 推送时,-u 参数可以直接关联本地分支与推送的目标分支
git push -u origin <branch_name>
# -u 参数实际就是 --set-upstream-to 过程
# 手动设置本地分支与远端分支的关联
git branch --set-upstream-to origin/<branch_name>

# 拉取远端分支并创建本地分支
git fetch origin <branch_name>:<branch_name>
# 拉取后需要手动 checkout 至新创建的分支
# 需要手动关联远端分支

# 拉取远端仓库信息至本地仓库(新分支 新tag 等)
git fetch origin


# 查看tag
git tag
# 创建tag
git tag -a <tag_name> -m "<tag_msg>"
# 在指定的 commit 上打tag
git tag -a <tag_name> <commit_msg> -m "<tag_msg>"

# 删除本地指定tag
git tag -d 1.0
# 删除远程标签
git push origin :refs/tags/标签名

# 建完标签后你必须显式地推送标签到共享服务器上
git push origin <tag_name>
git push origin --tags

# 在指定标签上创建一个新分支 标签的检出
git checkout -b <branch_name> <tag_name>


# 版本回退

# 强制回退（一般用于本地更新了内容进行放弃） 回到当前版本
git reset --hard HEAD
# 回到上一个版本
git reset --hard HEAD^
# 回到上上个版本
git reset --hard HEAD^^
# 回到100个版本前
git reset --hard HEAD~100

# 回到具体某个版本
git reset --hard 版本号（一般用前五位）


